    <?php

    class Nodo
    {
        
        private $nodosNamesArray;
        
        public function __construct() 
        {            
        }
        
        public function getNodosNamesArray()
        {
            return $this->nodosNamesArray;
        }
        
        public function cadastrar($parameters)
        {
           $usuario = new Zend_Session_Namespace('usuario');
           $db = Zend_Registry::get('db');            
           $sql = "INSERT INTO nodo (name,createData,eMailOwner)VALUES 
                                    ('".$parameters['name']."',NOW(),'".$usuario->eMail."');";           
           try
           {
                $db->query($sql);
           }
           catch (Zend_Exception $e)
           {
               echo ("A chave ja existe no BD");
           }           
                      
           if($parameters['nameNodoPai'])
           {
               $elements = explode(',',$parameters['nameNodoPai']);
               
               $this->verifyFatherNodos($elements);
                              
               foreach($elements as $pai)
               {
                   $sql = "INSERT INTO nodoPai (nameNodo,nameNodoPai) VALUES 
                            ('".$parameters['name']."','$pai');";
                   if(!$db->query($sql))
                   {
                       echo 'problema insert pai';
                   }
               }                            
           }
           if($parameters['nameNodoFilho'])
           {
               $elements = explode(',',$parameters['nameNodoFilho']);
               
               foreach($elements as $filho)
               {
                   $sql = "INSERT INTO nodoFilho (nameNodo,nameNodoFilho) VALUES
                            ('".$parameters['name']."','".$filho."');";
                   if(!$db->query($sql))
                   {
                     echo 'problema insert filho';  
                   }
               }
           }
        }
        
        
        public function getNodo()
        {         
            $stmt = "";
            require_once APPLICATION_PATH . '/forms/Forms_HiddenInfo.php';
            
            $db = Zend_Registry::get('db');
            $sql = "SELECT nodo.name, nodoPai.nameNodoPai,nodoFilho.nameNodoFilho,nodo.aprovedData
                    FROM nodo,nodoPai,nodoFilho
                    WHERE nodo.name = nodoPai.nameNodo
                    AND nodo.removedData IS NULL
                    AND nodo.name = nodoFilho.nameNodo
                    UNION 
                    SELECT nodo.name, NULL,NULL,NULL FROM nodo
                    WHERE nodo.removedData IS NULL
                    UNION
                    SELECT nodoFilho.nameNodo,NULL,nodoFilho.nameNodoFilho,NULL FROM nodoFilho, nodo
                    WHERE nodoFilho.nameNodo = nodo.name
                    AND removedData IS NULL;";            
            
            $stmt = $db->query($sql);            
            $stmt = $stmt->fetchAll();
                         
            $i = 0;            
            $nodos = '';
            $redundante = FALSE;
            
            if(is_array($stmt))
            {
                foreach($stmt as $val)
                {
                      if(is_array($nodos))
                      {
                          foreach($nodos as $id => $nodo)
                          {
                              if($val['name'] == $nodo['name'])
                              {
                                  $redundante = TRUE;
                                  
                                  foreach($nodo['pais'] as $idPai => $pai)
                                  {
                                      if($val['nameNodoPai'] == $pai)
                                          break;                                     
                                      if($idPai == (count($nodos[$id]['pais']))-1)
                                         $nodos[$id]['pais'][$idPai + 1]  = $val['nameNodoPai'];                                     
                                  }
                                  foreach($nodo['filhos'] as $idFilho => $filho)
                                  {
                                      if($val['nameNodoFilho'] == $filho)
                                          break;                                      
                                      if($idFilho == (count($nodos[$id]['filhos']))-1)
                                        $nodos[$id]['filhos'][$idFilho + 1] = $val['nameNodoFilho'];                                      
                                  }
                              }
                          }                          
                      }
                                           
                      if(!$redundante)
                      {
                            $nodos[$i] = array('name'=> $val['name'],'aproved' => $val['aprovedData'],'filhos' => array($val['nameNodoFilho']), 'pais' => array($val['nameNodoPai']));
                            $this->nodosNamesArray[$i] = $val['name'];
                            $i ++;
                      }
                      else
                      {
                          $redundante = FALSE;
                      }
                }
            }            
            
            return $this->showNodo($nodos); 
        }
        
        
        private function showNodo($nodos)
        { 
            $return = '';            
            if(is_array($nodos))
            {
                foreach($nodos as $id => $val)
                {
                    $return[$id] = "
                            <DIV id='nodo$id' style='background-color:cyan; 
                                                             botton:10px;
                                                             below: 10px;
                                                             left: 10px;
                                                             heigh: 200px;
                                                             width: 250px;
                                                             top: 10px;
                                                             position: relative;
                                                            '>";
                    $return[$id].="Nome do Nodo: ".$val['name'];                
                    if($val['aproved'] != NULL)
                    {
                        $status = ' Aprovado';
                    }                
                    else 
                    {
                     $status = ' Esperando Aprovacao';
                    }

                    $return[$id].="<br> Status:".$status;
                    $return[$id].="<br> Nodos Filhos: ";

                    $pais = '';
                    $filhos = '';

                    if(is_array($val['filhos']))
                    {
                        $return[$id].= $filhos = implode(',',$val['filhos']);
                    }

                    $return [$id].= "<br> Nodos Pais: ";

                    if(is_array($val['pais']))
                    {
                        $return[$id].= $pais = implode (',',$val['pais']);
                    }

                    $go = new Forms_HiddenInfo();
                    $return[$id].= $go->initialize("Ver","/nodo/into",array(array('name' => $val['name'],
                                                                                  'aproved'=> $status,
                                                                                  'nodsFilhos'=> $filhos,
                                                                                  'nodsPais' => $pais)));               
                    $return[$id].="</div><br>";
                }
             }        
            return $return;
        }
        
        public function verifyFatherNodos($fathersArray,$fathersUserPassedArray)
        {
            $verifier = 0;
                      
            if(is_array($fathersArray) && is_array($fathersUserPassedArray))
            {
                foreach($fathersArray as $father)
                {
                    foreach($fathersUserPassedArray as $fatherUser)
                    {
                        if($father == $fatherUser)
                        {
                            $verifier++;
                            break;
                        }                            
                    }
                }                
                if($fathersUserPassedArray[0] == "")
                    $verifier++;
              
                return FALSE;
            }
            
            return TRUE;
        }
        
        public function removeNodo($nodoName)
        {
            $db = Zend_Registry::get('db');
            $sql = "UPDATE nodo SET removedData = NOW() 
                where name = '$nodoName'";
            
            $stmt = $db->query($sql);
        }
        
        private function deleteNodo($nodoName)
        {
            $db = Zend_Registry::get('db');
            $sql =  "DELETE FROM nodo WHERE name = '$nodoName';";
            $stmt = $db->query($sql);
        }
        
        public function editNodo($newNodoName,
                                 $newFatherName,
                                 $newSonName,
                                 $newAprovation,
                                 $nodoName,
                                 $fatherName,
                                 $sonName
                                )
        {           
            $db = Zend_Registry::get('db');
            
            /* DA UPDATE AO NOME DO NODO */
                        
            $this->deleteNodo($nodoName); 

            $this->cadastrar(array('name' => $newNodoName, 'nameNodoPai' => $newFatherName, 
                                    'nameNodoFilho' => $newSonName));            
            /* APROVACAO DO NODO */
            if($newAprovation == 'yes')
            {
                $sql = "UPDATE nodo SET aprovedData = NOW()
                                WHERE name = '$newNodoName'";
                    
                $stmt = $db->query($sql);
            }           
            
            /* ESSA PARTE INSERE NOVOS NODOS FILHOS */
            foreach($sonName as $son)
            {               $sql = "DELETE FROM nodoFilho 
                                WHERE nameNodoFilho = '$son'
                                AND   nameNodo = '$nodoName'";
                $stml = $db->query($sql);                                            
            }
        
               
            foreach($newSonName as $son)
            {
                $sql = "INSERT INTO nodoFilho (nameNodo,nameNodoFilho)
                                                VALUES('$newNodoName','$son')";
                $stmt = $db->query($sql);
            }
            
            /* FIM DA INSERCAO DE FILHOS */
            
             /* ESSA PARTE INSERE NOVOS NODOS PAIS */
            foreach($fatherName as $father)
            {
                $sql = "DELETE FROM nodoPai 
                                WHERE nameNodoPai = '$father'
                                AND   nameNodo = '$nodoName'";
                $stmt = $db->query($sql);                                            
            }
            
            
            foreach($newFatherName as $father)
            {
                $sql = "INSERT INTO nodoPai (nameNodo,nameNodoPai)
                                                VALUES('$newNodoName','$father')";
                $stmt = $db->query($sql);
            }
            
            /* FIM DA INSERCAO DE FILHOS */
        }
    }
?>
